/* eslint-disable object-curly-newline */
import React, { Component } from 'react';
import { message } from 'antd';
import * as config from '../../../utils/config';
import * as utils from '../../../utils/utils';
import * as comFunc from '../../Common/ComFunc';
import * as commonServices from '../../../services/services';

export default (ChildComponent) => {
  return class getConfigHigher extends Component {
    /**   构造函数   */
    constructor(props) {
      super(props);
      this.state = {
        token: props.app.token, /*   页签令牌   */
        sTabId: this.getPaneDataValue(props, 'key'), /*   页签唯一标示   */
        sModelsId: this.getPaneDataValue(props, 'formId'), /*   获取配置数据用的modelId   */
        formRoute: this.getPaneDataValue(props, 'route'), /*   组件名:路由名称   */
        masterConfig: {}, /*   主表配置   */
        masterShowConfig: [], /*   主表显示配置   */
        slaveConfig: {}, /*   从表配置   */
        slaveColumn: [], /*   显示的从表表头   */
        slaveShowConfig: [], /*   从表显示配置   */
        checkConfig: {}, /*   审核配置   */
        checkColumn: [], /*   显示的审核表表头   */
        gdsformconst: [], /*   获取配置常量   */
        gdsjurisdiction: [], /*   获取配置权限   */
        billnosetting: {}, /*   是否自动审核   */
        report: [], /*   打印模板   */
        sId: '', /*   数据Id   */
        isLoadFinished: false, /*   是否加载完成   */
        pageLoading: true, /*   初始时要转圈圈   */
      };
    }

    /**   渲染前只执行一次   */
    componentWillMount() {
      /*   获取配置数据   */
      this.getConfigData();
    }

    /**   props改变的时候触发   */
    componentWillReceiveProps(nextProps) {
      /*   待用数据赋值   */
      const { currentPane } = nextProps.app;
      /*   渲染控制   */
      if (utils.isNotEmptyObject(currentPane)) {
        const {
          editTableRender,
          isRender,
          isRenderPart,
          showRender,
          showSlaveRender,
        } = currentPane;
        /*   区分是否是列表刷新调用   */
        if (utils.isNotUndefined(isRender)) { /*   非列表刷新调用   */
          this.setState({
            editTableRender,
            isRender,
            isRenderPart,
            showRender,
            showSlaveRender,
            isCommonListRefresh: false,
          });
        } else { /*   列表刷新调用   */
          this.setState({
            editTableRender,
            isCommonListRefresh: true,
          });
        }
      }
    }

    /**   返回true执行渲染,返回false不渲染   */
    shouldComponentUpdate(nextProps, nextState) {
      /*   待用数据赋值   */
      const { app } = nextProps;
      const { currentPane } = app;
      const currentKey = currentPane.key;
      const { sTabId, isLoadFinished, isCommonListRefresh } = nextState;
      /*   返回值   */
      return currentKey === sTabId && isLoadFinished && !isCommonListRefresh;
    }

    /**   获取页签数据值   */
    getPaneDataValue = (props, value) => {
      /*   待用数据赋值   */
      const { app } = props;
      const { secondppopupPane, ppopupPane, currentPane } = app;
      /*   返回值   */
      if (utils.isNotEmptyObject(secondppopupPane)) {
        return secondppopupPane[value];
      }
      if (utils.isNotEmptyObject(ppopupPane)) {
        return ppopupPane[value];
      }
      return currentPane[value];
    };

    /**   获取配置数据   */
    getConfigData = async () => {
      /*   待用数据赋值   */
      const { token, sModelsId } = this.state;
      const { app } = this.props;
      const { currentPane } = app;
      const { copyToData } = currentPane;
      /*   读取配置信息的url   */
      const configUrl = `${config.server_host}business/getModelBysId/${sModelsId}?sModelsId=${sModelsId}`;
      /*   配置返回数据   */
      const configReturn = (await commonServices.getService(token, configUrl)).data;
      /*   判断返回成功还是失败   */
      if (configReturn.code === 1) { /*   成功   */
        /*   成功就获取数据   */
        const [configData] = configReturn.dataset.rows;
        /*   获取配置   */
        this.handleGetData(configData, copyToData);
      } else { /*   失败   */
        message.error(configReturn.msg);
      }
    };

    /**   处理配置数据   */
    handleGetData = (configData, copyToData) => {
      /*   待用数据赋值   */
      const { app } = this.props; /*   应用数据   */
      const { currentPane } = app; /*   当前页签数据   */
      const { sParentId, sFilterOrderBy, pages, bFilter, isRender, currentIndex, checkedId } = currentPane; /*   上一条下一条信息   */
      const masterCopyData = utils.isEmptyObject(copyToData) ? {} : copyToData.masterData; /*   主表复制到数据   */
      const slaveCopyData = utils.isEmptyObject(copyToData) ? [] : copyToData.slaveData; /*   从表复制到数据   */
      const sId = utils.strUndefinedToEmpty(checkedId); /*   数据Id   */
      const { formData } = configData; /*   配置数据   */
      /*   过滤出配置相关信息   */
      let { masterShowConfig, slaveColumn, checkColumn, slaveShowConfig, checkShowConfig } = this.state;
      const masterConfig = formData.filter(item => !item.bGrd)[0]; /*   主表配置   */
      masterShowConfig = comFunc.getMasterShowConfig(masterConfig, masterShowConfig); /*   主表显示配置   */
      const slaveConfig = formData.filter(item => item.bGrd && item.sTbName !== 'sysbillcheckresult')[0]; /*   从表配置   */
      slaveColumn = comFunc.getHeaderConfig(slaveConfig, slaveColumn); /*   从表title配置   */
      slaveShowConfig = comFunc.getSlaveShowConfig(slaveConfig, slaveShowConfig); /*   从表显示配置   */
      const checkConfig = formData.filter(item => item.bGrd && item.sTbName === 'sysbillcheckresult')[0]; /*   审核表配置   */
      checkColumn = comFunc.getHeaderConfig(checkConfig, checkColumn);
      checkShowConfig = comFunc.getSlaveShowConfig(checkConfig, checkShowConfig); /*   审核表显示配置   */
      /*   state赋值   */
      this.setState({
        ...configData,
        copyToData,
        masterCopyData,
        slaveCopyData,
        sId,
        isRender,
        masterConfig,
        masterShowConfig,
        slaveConfig,
        slaveColumn,
        slaveShowConfig,
        checkConfig,
        checkColumn,
        checkShowConfig,
        sParentId,
        sFilterOrderBy,
        pages,
        bFilter,
        currentIndex,
        isLoadFinished: true,
      });
    };

    /**   渲染   */
    render() {
      return (
        <ChildComponent
          {...this.props}
          {...this.state}
        />
      );
    }
  };
};

